package educar.models;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import educar.db.JPA;

public class Solucion {
	private String cod_solucion;
	private String fecha_entrega;
	private String hora_entrega;
	private Teacher docente;
	private String nota;
	private String file_path;
	private static JPA jpa= new JPA();
	
	
	/**
	 * metodo constructor de la clase solucion
	 * @param newCod_solucion "String que contiene el codigo de solucion"
	 * @param newFecha_entrega "String que contiene la fecha de entrega"
	 * @param newHora_entrega "String que contiene la hora de entrega"
	 * @param newDocente "Tipo Docente que contiene al docente que esta vinculada con la solucion"
	 * @param newNota "String que contiene la nota de la solucion"
	 */
	public Solucion(String newCod_solucion, String newFecha_entrega, String newHora_entrega, Teacher newDocente, String newNota, String newFile_path) {
		setCod_solucion(newCod_solucion);
		setFecha_entrega(newFecha_entrega);
		setHora_entrega(newHora_entrega);
		setDocente(newDocente);
		setNota(newNota);
		setFile_path(newFile_path);
	}
	
	/**
	 * retorna el codigo de la solucion
	 * @return String "con el codigo de la solucion"
	 */
	public String getCod_solucion(){
		return cod_solucion;
	}
	/**
	 * establece el codigo de la solucion
	 * @param newCod_solucion "nuevo codigo de la solucion"
	 */
	public void setCod_solucion(String newCod_solucion){
		cod_solucion = newCod_solucion;
	}
	
	/**
	 * devuelve la fecha de entrega de la solucion
	 * @return String "que contiene la fecha de entrega"
	 */
	public String getFecha_entrega(){
		return fecha_entrega;
	}
	
	/**
	 * establece la fecha de entrega
	 * @param newFecha_entrega "nueva fecha de entrega de la solucion"
	 */
	public void setFecha_entrega(String newFecha_entrega){
		fecha_entrega = newFecha_entrega;
	}
	
	/**
	 * devuelve la hora de entrega de la solucion
	 * @return String "que contiene la hora de entrega de la solucion"
	 */
	public String getHora_entrega(){
		return hora_entrega;
	}
	
	/**
	 * establece la hora de entrega de la solucion
	 * @param newHora_entrega "nueva hora de entrega de la solucion"
	 */
	public void setHora_entrega(String newHora_entrega){
		hora_entrega = newHora_entrega;
	}
	/**
	 * devuelve el docente vinculado a la solucion
	 * @return Teacher "que contiene el docente vinculado a la solucion"
	 */
	public Teacher getdocente(){
		return docente;
	}
	
	/**
	 * establece el docente vinculado a la solucion
	 * @param newDocente "nuevo docente vinculado a la solucion"
	 */
	public void setDocente(Teacher newDocente){
		docente = newDocente;
	}
	
	/**
	 * devuelve la nota de la solucion
	 * @return String "que contiene la nota de la solucion"
	 */
	public String getNota(){
		return nota;
	}
	
	/**
	 * establece la nota de la solucion
	 * @param newNota "nueva nota de la solucion"
	 */
	public void setNota(String newNota){
		nota = newNota;
	}
	
	/**
	 * @return the file_path
	 */
	public String getFile_path() {
		return file_path;
	}

	/**
	 * @param file_path the file_path to set
	 */
	public void setFile_path(String file_path) {
		this.file_path = file_path;
	}

	/**
	 * Permite guardar una solucion en la base de datos
	 * @return si pudo realizar la operacion
	 */
	public boolean save() {
		try {
			Solucion.getSolucionByCode(getCod_solucion());
			return false;
		} catch (solucionNotFound e1) {
			String[] columns = {"fecha_entrega", "hora_entrega", "dni", "nota" ,"file_path"};
			PreparedStatement stm = jpa.newRecord("solucion", columns);
			try {				
				stm.setString(1, getFecha_entrega());
				stm.setString(2, getHora_entrega());
				if(docente!=null) {
					stm.setString(3, docente.getDni());
				}
				else {					
					stm.setNull(3,0);
				}
				stm.setString(4, getNota());
				stm.setString(5, getFile_path());
			} catch (SQLException e) {
				e.printStackTrace();
				return false;
			}
			jpa.create(stm);
			setCod_solucion(getMaxNumber());
			return true;
		}
	}	

		/**
		 * dada una solucion permite borrarla de la base de datos
		 */
		public void destroy() {
			try {
				jpa.destroy("solucion", "cod_solucion", String.valueOf(getCod_solucion()));
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		/**
		 * permite actualizar en la base de datos un solucion 
		 * @return si pudo realizar la operacion
		 */
		public boolean update() {
			try {
				String[] datos = {getFecha_entrega(),getHora_entrega(),docente.getDni(),getNota(),getFile_path()};
				String[] columns = { "fecha_entrega","hora_entrega","dni","nota","file_path" };
				jpa.update("solucion", columns, datos, "cod_solucion", getCod_solucion());
				return true;
			} catch(Exception ex) {
				return false;
			}
		}
	
		/**
		 * dado un codigo de solucion obtiene la solucion de la base de datos a la que hace referencia 
		 * @param cod_solucion "String que contiene el codigo de la solucion"
		 * @return Solucion "objeto del tipo solucion"
		 * @throws solucionNotFound "por si no se encontro en la solucion dada"
		 */
		public static Solucion getSolucionByCode(String cod_solucion) throws solucionNotFound {
			ResultSet rs = null;
			Solucion s = null;
			rs = jpa.getByField("solucion", "cod_solucion", cod_solucion);
			try {
				if (rs.next()) {
					Teacher t = null;
					if(rs.getString(4)!=null) {
						try {
							t = Teacher.getTeacherByDni(rs.getString(4));
						} catch (teacherNotFound e) {
							t = null;
						}
					}
					s = new Solucion(rs.getString(1), rs.getString(2), rs.getString(3),t, rs.getString(5),rs.getString(6));
				} else {
					throw new solucionNotFound();
				}
			} catch (SQLException e) {
				throw new solucionNotFound();
			} catch (NumberFormatException e) {
				throw new solucionNotFound();
			}
			return s;
		}

		
		
		/**
		 * Permite obtener una solucion por el dni del alumno 
		 * y el codigo de la actividad
		 * @param dni  "DNI del alumno"
		 * @param cod_actividad "codigo de la actividad a buscar la solucion"
		 * @return Objeto Solucion
		 * @throws solucionNotFound "si la solucion no existe"
		 */
		public static Solucion getSolucionByDNIandCodActividad(String dni,String cod_actividad) throws solucionNotFound {
			ResultSet rs = null;
			String[] columnas = {"dni","cod_actividad"};
			String[] datos = {dni,cod_actividad};
			rs = jpa.getByField("tiene", columnas,datos);
			String cod_solucion = null;
			try {
				if(rs.next()) {
					cod_solucion = rs.getString(3);
				}
			} catch (SQLException e1) {
				throw new solucionNotFound();
			}
			if (cod_solucion!=null) {
				return getSolucionByCode(cod_solucion);
			}
			else {
				throw new solucionNotFound();
			}
		}
		
		
		/**
		 * obtiene el valor del codigo de solucion maximo
		 * se usa para obtener el valor del auto incremental
		 * insertado al ultimo
		 * @return String con el valor del numero
		 */
		private String getMaxNumber() {
			int max = 0;
			String[][] tmp = jpa.ResultSetToStringArray(jpa.showProyection("solucion", "cod_solucion"));			
			for(int i=0;i<tmp.length;i++){
				int act = Integer.parseInt(tmp[i][0]);
				if ( act > max) {
					max = act;					
				}
			}			
			return String.valueOf(max);
		}
}

